{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Imporing Libraries"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 85,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-05-15T08:09:12.160801Z",
     "start_time": "2020-05-15T08:09:12.157970Z"
    }
   },
   "outputs": [],
   "source": [
    "# Data Visualization\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "# Data Processing\n",
    "import pandas as pd\n",
    "\n",
    "# NLP \n",
    "import re\n",
    "\n",
    "# Others\n",
    "import os\n",
    "from collections import defaultdict"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Processing and Preparing Data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 86,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-05-15T08:09:12.745604Z",
     "start_time": "2020-05-15T08:09:12.742720Z"
    }
   },
   "outputs": [],
   "source": [
    "def string_processing(answer):\n",
    "    pattern = '(?<! )(?=[!\\\"#$%&\\'()\\*\\+,-\\.:;=?@\\[\\]\\\\^_`\\|\\{\\}~])|(?<=[!\\\"#$%&\\'()\\*\\+,-\\.:;=?@\\[\\]\\\\^_`\\|\\{\\}~])(?! )'\n",
    "    answer = re.sub(pattern, r' ',  answer)\n",
    "    return answer"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-05-03T19:02:24.891505Z",
     "start_time": "2020-05-03T19:02:24.872160Z"
    }
   },
   "source": [
    "## Processing Crawled Data from CounselChat.com"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 87,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-05-15T08:09:15.026252Z",
     "start_time": "2020-05-15T08:09:12.908550Z"
    }
   },
   "outputs": [],
   "source": [
    "path = \"../data/CouncilChat-CrawledData/\"\n",
    "files = os.listdir(path)\n",
    "files_xls = [f for f in files if f[-4:] == 'xlsx']\n",
    "list_df = []\n",
    "temp = []\n",
    "\n",
    "for index, filename in enumerate(files_xls):\n",
    "    try: \n",
    "        list_df.append(pd.read_excel(path+filename))\n",
    "        temp.append(filename.split(\".\")[0])\n",
    "    except:\n",
    "        temp.append()\n",
    "\n",
    "df_crawled = pd.concat(list_df)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 88,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-05-15T08:09:15.043884Z",
     "start_time": "2020-05-15T08:09:15.028261Z"
    }
   },
   "outputs": [],
   "source": [
    "df_crawled.dropna(inplace = True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 89,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-05-15T08:09:15.058992Z",
     "start_time": "2020-05-15T08:09:15.046490Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Unnamed: 0</th>\n",
       "      <th>questionID</th>\n",
       "      <th>questionTitle</th>\n",
       "      <th>questionText</th>\n",
       "      <th>questionLink</th>\n",
       "      <th>topic</th>\n",
       "      <th>therapistName</th>\n",
       "      <th>therapistTitle</th>\n",
       "      <th>therapistURL</th>\n",
       "      <th>answerText</th>\n",
       "      <th>upvotes</th>\n",
       "      <th>views</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>I just lost my grandpa</td>\n",
       "      <td>I just lost my grandpa and i'm having a rough ...</td>\n",
       "      <td>https://counselchat.com/questions/i-just-lost-...</td>\n",
       "      <td>grief-and-loss</td>\n",
       "      <td>Ian Palombo</td>\n",
       "      <td>#ThoughtMediator &amp; #LifeUntangler</td>\n",
       "      <td>https://counselchat.com/therapists/ian-palombo</td>\n",
       "      <td>Feeling profound sadness after the death of a ...</td>\n",
       "      <td>0</td>\n",
       "      <td>92</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>I just lost my grandpa</td>\n",
       "      <td>I just lost my grandpa and i'm having a rough ...</td>\n",
       "      <td>https://counselchat.com/questions/i-just-lost-...</td>\n",
       "      <td>grief-and-loss</td>\n",
       "      <td>Dr. Melissa Valentina</td>\n",
       "      <td>Honor Yourself and Live Your Truth</td>\n",
       "      <td>https://counselchat.com/therapists/dr-melissa-...</td>\n",
       "      <td>If you connect with your therapist and can say...</td>\n",
       "      <td>0</td>\n",
       "      <td>16</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>I just lost my grandpa</td>\n",
       "      <td>I just lost my grandpa and i'm having a rough ...</td>\n",
       "      <td>https://counselchat.com/questions/i-just-lost-...</td>\n",
       "      <td>grief-and-loss</td>\n",
       "      <td>Dr. Timothy Paul</td>\n",
       "      <td>'man'; Online - \"Natural Health Consultant and...</td>\n",
       "      <td>https://counselchat.com/therapists/dr-timothy-...</td>\n",
       "      <td>Yknow, to see a man youve loved and care for p...</td>\n",
       "      <td>0</td>\n",
       "      <td>30</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>I just lost my grandpa</td>\n",
       "      <td>I just lost my grandpa and i'm having a rough ...</td>\n",
       "      <td>https://counselchat.com/questions/i-just-lost-...</td>\n",
       "      <td>grief-and-loss</td>\n",
       "      <td>Christina McGrath Fair</td>\n",
       "      <td>\"Enlightenment is when a wave realizes it is t...</td>\n",
       "      <td>https://counselchat.com/therapists/christina-m...</td>\n",
       "      <td>I am sorry for your loss. I understand the dif...</td>\n",
       "      <td>0</td>\n",
       "      <td>157</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>4</td>\n",
       "      <td>1</td>\n",
       "      <td>I just lost my grandpa</td>\n",
       "      <td>I just lost my grandpa and i'm having a rough ...</td>\n",
       "      <td>https://counselchat.com/questions/i-just-lost-...</td>\n",
       "      <td>grief-and-loss</td>\n",
       "      <td>Pamela Suraci</td>\n",
       "      <td>Build on your strengths, grow in your challeng...</td>\n",
       "      <td>https://counselchat.com/therapists/pamela-suraci</td>\n",
       "      <td>Losing someone you love, someone who has been ...</td>\n",
       "      <td>0</td>\n",
       "      <td>231</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   Unnamed: 0  questionID           questionTitle  \\\n",
       "0           0           1  I just lost my grandpa   \n",
       "1           1           1  I just lost my grandpa   \n",
       "2           2           1  I just lost my grandpa   \n",
       "3           3           1  I just lost my grandpa   \n",
       "4           4           1  I just lost my grandpa   \n",
       "\n",
       "                                        questionText  \\\n",
       "0  I just lost my grandpa and i'm having a rough ...   \n",
       "1  I just lost my grandpa and i'm having a rough ...   \n",
       "2  I just lost my grandpa and i'm having a rough ...   \n",
       "3  I just lost my grandpa and i'm having a rough ...   \n",
       "4  I just lost my grandpa and i'm having a rough ...   \n",
       "\n",
       "                                        questionLink           topic  \\\n",
       "0  https://counselchat.com/questions/i-just-lost-...  grief-and-loss   \n",
       "1  https://counselchat.com/questions/i-just-lost-...  grief-and-loss   \n",
       "2  https://counselchat.com/questions/i-just-lost-...  grief-and-loss   \n",
       "3  https://counselchat.com/questions/i-just-lost-...  grief-and-loss   \n",
       "4  https://counselchat.com/questions/i-just-lost-...  grief-and-loss   \n",
       "\n",
       "            therapistName                                     therapistTitle  \\\n",
       "0             Ian Palombo                  #ThoughtMediator & #LifeUntangler   \n",
       "1   Dr. Melissa Valentina                 Honor Yourself and Live Your Truth   \n",
       "2        Dr. Timothy Paul  'man'; Online - \"Natural Health Consultant and...   \n",
       "3  Christina McGrath Fair  \"Enlightenment is when a wave realizes it is t...   \n",
       "4           Pamela Suraci  Build on your strengths, grow in your challeng...   \n",
       "\n",
       "                                        therapistURL  \\\n",
       "0     https://counselchat.com/therapists/ian-palombo   \n",
       "1  https://counselchat.com/therapists/dr-melissa-...   \n",
       "2  https://counselchat.com/therapists/dr-timothy-...   \n",
       "3  https://counselchat.com/therapists/christina-m...   \n",
       "4   https://counselchat.com/therapists/pamela-suraci   \n",
       "\n",
       "                                          answerText  upvotes  views  \n",
       "0  Feeling profound sadness after the death of a ...        0     92  \n",
       "1  If you connect with your therapist and can say...        0     16  \n",
       "2  Yknow, to see a man youve loved and care for p...        0     30  \n",
       "3  I am sorry for your loss. I understand the dif...        0    157  \n",
       "4  Losing someone you love, someone who has been ...        0    231  "
      ]
     },
     "execution_count": 89,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_crawled.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 90,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-05-15T08:09:15.065943Z",
     "start_time": "2020-05-15T08:09:15.061580Z"
    }
   },
   "outputs": [],
   "source": [
    "df_crawled.drop(\"Unnamed: 0\", axis = 1, inplace = True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 91,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-05-15T08:09:15.071706Z",
     "start_time": "2020-05-15T08:09:15.068085Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(12139, 11)"
      ]
     },
     "execution_count": 91,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_crawled.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 92,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-05-15T08:09:15.076892Z",
     "start_time": "2020-05-15T08:09:15.073562Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(12139, 11)"
      ]
     },
     "execution_count": 92,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_crawled.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 93,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-05-15T08:09:15.082663Z",
     "start_time": "2020-05-15T08:09:15.078688Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "33"
      ]
     },
     "execution_count": 93,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_crawled.topic.nunique()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 94,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-05-15T08:09:15.090662Z",
     "start_time": "2020-05-15T08:09:15.085863Z"
    }
   },
   "outputs": [],
   "source": [
    "df_crawled = df_crawled[[\"questionTitle\",\"questionText\",\"questionLink\",\"topic\",\"answerText\",\"upvotes\",\"views\"]]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 95,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-05-15T08:09:15.148912Z",
     "start_time": "2020-05-15T08:09:15.093197Z"
    }
   },
   "outputs": [],
   "source": [
    "df_crawled[\"questionText\"] = df_crawled[\"questionTitle\"] + \" \" + df_crawled[\"questionText\"]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 96,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-05-15T08:09:15.160766Z",
     "start_time": "2020-05-15T08:09:15.151326Z"
    }
   },
   "outputs": [],
   "source": [
    "df_crawled = df_crawled.reset_index()\n",
    "df_crawled = df_crawled.drop(['index'], axis = 1)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Preprocessing Kaggle Data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 97,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-05-15T08:09:15.296592Z",
     "start_time": "2020-05-15T08:09:15.162681Z"
    }
   },
   "outputs": [],
   "source": [
    "df_kaggle = pd.read_csv('/Users/kaushik-shakkari/Downloads/Psych_data.csv')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 98,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-05-15T08:09:15.304841Z",
     "start_time": "2020-05-15T08:09:15.298458Z"
    }
   },
   "outputs": [],
   "source": [
    "df_kaggle.Answer = df_kaggle.Answer.astype(str)\n",
    "df_kaggle.Question = df_kaggle.Question.astype(str)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 99,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-05-15T08:09:15.311532Z",
     "start_time": "2020-05-15T08:09:15.306967Z"
    }
   },
   "outputs": [],
   "source": [
    "if 'Unnamed: 0' in df_kaggle.columns:\n",
    "    df_kaggle.drop(['Unnamed: 0'], inplace = True, axis = 1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 100,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-05-15T08:09:15.324077Z",
     "start_time": "2020-05-15T08:09:15.313573Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "False    3788\n",
       "True     1530\n",
       "Name: Question, dtype: int64"
      ]
     },
     "execution_count": 100,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "(df_kaggle.Question.str.find(\"?\") != -1).value_counts()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 101,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-05-15T08:09:15.334373Z",
     "start_time": "2020-05-15T08:09:15.326058Z"
    }
   },
   "outputs": [],
   "source": [
    "question_df = df_kaggle[df_kaggle.Question.str.find(\"?\") != -1]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 102,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-05-15T08:09:15.342097Z",
     "start_time": "2020-05-15T08:09:15.336480Z"
    }
   },
   "outputs": [],
   "source": [
    "question_df = question_df.reset_index()\n",
    "question_df.drop(['index'], axis = 1, inplace = True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 103,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-05-15T08:09:15.352986Z",
     "start_time": "2020-05-15T08:09:15.344208Z"
    },
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Answer</th>\n",
       "      <th>Question</th>\n",
       "      <th>Therapist</th>\n",
       "      <th>time</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>It’s impossible to give a diagnosis over the i...</td>\n",
       "      <td>I don’t even really know where to start. For t...</td>\n",
       "      <td>7</td>\n",
       "      <td>2019-09-14</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>Congratulations on bringing your new baby into...</td>\n",
       "      <td>From a woman in the UK: Hi, I have a 4 month o...</td>\n",
       "      <td>2</td>\n",
       "      <td>2019-09-16</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>Just by writing to us you have begun to make t...</td>\n",
       "      <td>Hello! I would like to know some exercises or ...</td>\n",
       "      <td>0</td>\n",
       "      <td>2019-09-6</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>Incest involves sexual relationships between p...</td>\n",
       "      <td>Me and my older brother have always been close...</td>\n",
       "      <td>7</td>\n",
       "      <td>2019-09-19</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>Thank you for writing. In my opinion, this is ...</td>\n",
       "      <td>From a young woman in the U.S.: I have had eno...</td>\n",
       "      <td>2</td>\n",
       "      <td>2019-09-11</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                                              Answer  \\\n",
       "0  It’s impossible to give a diagnosis over the i...   \n",
       "1  Congratulations on bringing your new baby into...   \n",
       "2  Just by writing to us you have begun to make t...   \n",
       "3  Incest involves sexual relationships between p...   \n",
       "4  Thank you for writing. In my opinion, this is ...   \n",
       "\n",
       "                                            Question  Therapist        time  \n",
       "0  I don’t even really know where to start. For t...          7  2019-09-14  \n",
       "1  From a woman in the UK: Hi, I have a 4 month o...          2  2019-09-16  \n",
       "2  Hello! I would like to know some exercises or ...          0   2019-09-6  \n",
       "3  Me and my older brother have always been close...          7  2019-09-19  \n",
       "4  From a young woman in the U.S.: I have had eno...          2  2019-09-11  "
      ]
     },
     "execution_count": 103,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "question_df.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 104,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-05-15T08:09:15.490396Z",
     "start_time": "2020-05-15T08:09:15.355281Z"
    }
   },
   "outputs": [],
   "source": [
    "question_df.Question = question_df.Question.apply(string_processing)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 105,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-05-15T08:09:15.496842Z",
     "start_time": "2020-05-15T08:09:15.493287Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(1530, 4)"
      ]
     },
     "execution_count": 105,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "question_df.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 106,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-05-15T08:09:15.619770Z",
     "start_time": "2020-05-15T08:09:15.615768Z"
    }
   },
   "outputs": [],
   "source": [
    "question_df.rename(columns={'Question': 'questionText','Answer':'answerText'}, inplace=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 107,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-05-15T08:09:16.142588Z",
     "start_time": "2020-05-15T08:09:16.138884Z"
    }
   },
   "outputs": [],
   "source": [
    "def findLastIndex(strn): \n",
    "    li_strn = strn.split()\n",
    "    index = -1\n",
    "    for i in range(0, len(li_strn)): \n",
    "        if li_strn[i] == '?': \n",
    "            index = i \n",
    "    return index, li_strn, len(li_strn)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 108,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-05-15T08:09:16.463218Z",
     "start_time": "2020-05-15T08:09:16.460828Z"
    }
   },
   "outputs": [],
   "source": [
    "question_df.questionTitle = \"\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 109,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-05-15T08:09:19.144741Z",
     "start_time": "2020-05-15T08:09:16.677788Z"
    },
    "scrolled": false
   },
   "outputs": [],
   "source": [
    "for i in range(question_df.shape[0]):\n",
    "    #if i == 834:\n",
    "    \n",
    "    question_df.loc[i,\"questionText\"] = re.sub('\\?\\?+','?',question_df.loc[i,\"questionText\"])\n",
    "\n",
    "    li = re.findall('(?<=\\.|\\?)[^\\.]+?\\?', question_df.loc[i,\"questionText\"])\n",
    "\n",
    "    if li == []:\n",
    "        li1 = re.findall('.*\\?', question_df.loc[i,\"questionText\"])\n",
    "        li1.sort(key = lambda x:len(x))\n",
    "        ques = li1[-1]\n",
    "    else:\n",
    "        li.sort(key = lambda x:len(x))\n",
    "        ques = li[-1]\n",
    "    question_df.loc[i,\"questionTitle\"] = ques.strip()\n",
    "    #print (\"questionTitle\" ,ques)\n",
    "    index, li_qt, context_len = findLastIndex(question_df.loc[i,\"questionText\"])\n",
    "\n",
    "    pre_ques_len =  index \n",
    "    post_ques_len = context_len - index \n",
    "    #print (\"pre: \", pre_ques_len)\n",
    "    #print (\"post: \", post_ques_len)\n",
    "\n",
    "    if pre_ques_len > 300 and post_ques_len > 200:\n",
    "        qt = ' '.join(li_qt[index-300:index] + li_qt[index:index+200])\n",
    "    elif pre_ques_len > 300:\n",
    "        if index-300-200+post_ques_len < 0:\n",
    "            indx = 0\n",
    "        else:\n",
    "            indx = index-300-200+post_ques_len\n",
    "        qt = ' '.join(li_qt[indx:index] + li_qt[index:index+post_ques_len])\n",
    "    elif post_ques_len > 200:\n",
    "        qt = ' '.join(li_qt[index-pre_ques_len:index] + li_qt[index:index+200+300-pre_ques_len])\n",
    "    else:\n",
    "        qt = ' '.join(li_qt)\n",
    "    #print (\"question text: \", qt)\n",
    "    question_df.loc[i,\"questionText\"] = qt\n",
    "    "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 110,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-05-15T08:09:19.155600Z",
     "start_time": "2020-05-15T08:09:19.146802Z"
    },
    "scrolled": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>answerText</th>\n",
       "      <th>questionText</th>\n",
       "      <th>Therapist</th>\n",
       "      <th>time</th>\n",
       "      <th>questionTitle</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>612</th>\n",
       "      <td>I’m sorry that you have had such difficulties...</td>\n",
       "      <td>Our son is 27 years old . He has had a rocky c...</td>\n",
       "      <td>5</td>\n",
       "      <td>2018-05-8</td>\n",
       "      <td>Any suggestions ?</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                                            answerText  \\\n",
       "612   I’m sorry that you have had such difficulties...   \n",
       "\n",
       "                                          questionText  Therapist       time  \\\n",
       "612  Our son is 27 years old . He has had a rocky c...          5  2018-05-8   \n",
       "\n",
       "         questionTitle  \n",
       "612  Any suggestions ?  "
      ]
     },
     "execution_count": 110,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "question_df.sample()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Generating Root Topics, Multilabels for Questions"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 111,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-05-15T08:09:34.035977Z",
     "start_time": "2020-05-15T08:09:19.158564Z"
    }
   },
   "outputs": [],
   "source": [
    "di = defaultdict(set)\n",
    "\n",
    "for i in range(df_crawled.shape[0]):\n",
    "    if str(df_crawled.loc[i,\"topic\"]) in [\"relationships\",\"intimacy\",\"family-conflict\",\"parenting\",\"relationship-dissolution\",\"marriage\",\"domestic-violence\"]:\n",
    "        df_crawled.loc[i,\"root_topic\"] = \"family_conflicts\"\n",
    "    elif df_crawled.loc[i,\"topic\"] in [\"depression\",\"anxiety\",\"stress\",\"anger-management\",\"trauma\"]:\n",
    "        df_crawled.loc[i,\"root_topic\"] = \"emotional_conflicts\"\n",
    "    else:\n",
    "        df_crawled.loc[i,\"root_topic\"] = \"others\"\n",
    "    \n",
    "    di[df_crawled.loc[i,\"questionTitle\"]].add(df_crawled.loc[i,\"root_topic\"])\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 112,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-05-15T08:09:34.047763Z",
     "start_time": "2020-05-15T08:09:34.038125Z"
    }
   },
   "outputs": [],
   "source": [
    "df_crawled.sort_values(by=['upvotes','views'], ascending=False, inplace = True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 113,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-05-15T08:09:34.062439Z",
     "start_time": "2020-05-15T08:09:34.050134Z"
    }
   },
   "outputs": [],
   "source": [
    "df_crawled.drop_duplicates(subset=['questionTitle','topic'], keep=\"first\",inplace = True)\n",
    "df_crawled = df_crawled.reset_index()\n",
    "df_crawled = df_crawled.drop(\"index\", axis = 1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 114,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-05-15T08:09:34.067883Z",
     "start_time": "2020-05-15T08:09:34.064537Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(1425, 8)"
      ]
     },
     "execution_count": 114,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_crawled.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 115,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-05-15T08:09:34.407697Z",
     "start_time": "2020-05-15T08:09:34.070374Z"
    },
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.axes._subplots.AxesSubplot at 0x115b130f0>"
      ]
     },
     "execution_count": 115,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "df_crawled.topic.value_counts().apply(lambda x:x).plot(kind='bar')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 116,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-05-15T08:09:34.418590Z",
     "start_time": "2020-05-15T08:09:34.411123Z"
    }
   },
   "outputs": [],
   "source": [
    "df_crawled.drop_duplicates(subset=['questionTitle'], keep=\"first\",inplace = True)\n",
    "df_crawled = df_crawled.reset_index()\n",
    "df_crawled = df_crawled.drop(\"index\", axis = 1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 117,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-05-15T08:09:34.424288Z",
     "start_time": "2020-05-15T08:09:34.421055Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(807, 8)"
      ]
     },
     "execution_count": 117,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_crawled.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 118,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-05-15T08:09:34.438883Z",
     "start_time": "2020-05-15T08:09:34.426420Z"
    }
   },
   "outputs": [],
   "source": [
    "labels = []\n",
    "for i in range(df_crawled.shape[0]):\n",
    "    topics = list(di[df_crawled.loc[i,\"questionTitle\"]])\n",
    "    label = [0,0,0]\n",
    "    for topic in topics:\n",
    "        if topic == 'family_conflicts':\n",
    "            label[0] = 1\n",
    "        if topic == 'emotional_conflicts':\n",
    "            label[1] = 1\n",
    "        if topic == 'others':\n",
    "            label[2] = 1\n",
    "    labels.append(label)\n",
    "\n",
    "df_crawled[\"root_multi_label\"] = pd.Series(labels, dtype = object)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Combining Kaggle Data with CouncilChat Data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 119,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-05-15T08:09:34.451569Z",
     "start_time": "2020-05-15T08:09:34.440905Z"
    }
   },
   "outputs": [],
   "source": [
    "final_df = pd.concat([df_crawled[[\"questionTitle\",\"questionText\",\"answerText\"]], question_df[[\"questionTitle\",\"questionText\",\"answerText\"]]])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 120,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-05-15T08:09:34.459441Z",
     "start_time": "2020-05-15T08:09:34.453637Z"
    }
   },
   "outputs": [],
   "source": [
    "final_df = final_df.reset_index()\n",
    "final_df = final_df.drop(\"index\", axis = 1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 121,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-05-15T08:09:34.464886Z",
     "start_time": "2020-05-15T08:09:34.461494Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(2337, 3)"
      ]
     },
     "execution_count": 121,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "final_df.shape"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Generating Good Reflections from Therapists Answers"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 122,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-05-15T08:09:34.668265Z",
     "start_time": "2020-05-15T08:09:34.466855Z"
    }
   },
   "outputs": [],
   "source": [
    "final_df.answerText = final_df.answerText.apply(string_processing)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 123,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-05-15T08:09:40.008658Z",
     "start_time": "2020-05-15T08:09:34.670682Z"
    }
   },
   "outputs": [],
   "source": [
    "for i in range(final_df.shape[0]):\n",
    "    # extract if a sentence in answer has sounds like or seems like\n",
    "    if re.findall(r\"([^.]*?(sounds like|seems like)[^.]*\\.)\",final_df.loc[i,\"answerText\"]):\n",
    "        final_df.loc[i,\"reflection\"] = re.findall(r\"([^.]*?(sounds like|seems like)[^.]*\\.)\",final_df.loc[i,\"answerText\"])[0][0] \n",
    "    # check if answer contains atleast 2 senetences, extract the second sentence if the first sentence is shorter (for example if \"hello\" is the first sentence) \n",
    "    # check oif hello or thank you is present in first sentence, then extract second sentence\n",
    "    elif (\n",
    "        (len(final_df.loc[i,\"answerText\"].split(\".\")[0].split()) <= 2 and len(final_df.loc[i,\"answerText\"].split(\".\")) >= 2)\n",
    "        or ((\"hello\" in final_df.loc[i,\"answerText\"].split(\".\")[0].lower() or \"hi\" in final_df.loc[i,\"answerText\"].split(\".\")[0].lower() or \"thank you\" in final_df.loc[i,\"answerText\"].split(\".\")[0].lower()) and len(final_df.loc[i,\"answerText\"].split(\".\")) >= 2)):\n",
    "        final_df.loc[i,\"reflection\"] = final_df.loc[i,\"answerText\"].split(\".\")[1].strip()\n",
    "    # else just extract the first sentence as reflection\n",
    "    else:\n",
    "        final_df.loc[i,\"reflection\"] = final_df.loc[i,\"answerText\"].split(\".\")[0].strip()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Saving the Preprocessed Dataset in the Data Folder"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 124,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-05-15T08:09:40.028966Z",
     "start_time": "2020-05-15T08:09:40.010183Z"
    }
   },
   "outputs": [],
   "source": [
    "final_df.to_pickle(\"../data/preprocessed_dataset\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.3"
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": true,
   "sideBar": true,
   "skip_h1_title": false,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {},
   "toc_section_display": true,
   "toc_window_display": false
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
